/**
 * Classe que representa uma entrada na tabela de roteamento.
 * 
 * @author Alexandre Sales, Alexandre Teixeira e Diogo Anderson.
 */
public class Entry {

	/**
	 * Inteiro que representa o infinito, de modo a detectar a contagem ad
	 * infinitum.
	 */
	public static final int INFINITO = 9999;

	// distancia ao no id e o proximo salto no caminho
	private int id, cost, next_hop;

	

	/**
	 * Cria uma entrada da tabela de distancias.
	 * 
	 * @param id
	 *            identificador da entrada na tabela
	 * @param cost
	 *            distancia para se chegar ate o no.
	 * @param next_hop
	 *            proximo salto no caminho ate o no.
	 */
	public Entry(int id, int cost, int next_hop) {
		this.id = id;
		this.cost = cost;
		this.next_hop = next_hop;
	}

	/**
	 * Cria uma entrada a partir de uma String, o inverso do getAsString().
	 * 
	 * @param entry
	 *            String que descreve a entrada: "distancia,salto".
	 */
	public Entry(String entry, int next_hop) {
		String[] split = entry.split(",");

		this.id = Integer.parseInt(split[0].trim());
		this.cost = Integer.parseInt(split[1].trim());
		this.next_hop = next_hop;
	}

	/**
	 * Recupera a distancia ate um no.
	 * 
	 * @param id
	 *            identificador para quem o roteador ira enviar esta distancia.
	 * @return infinito, caso id seja o proximo salto (reversao envenenada). A
	 *         distancia correta, caso contrario.
	 */
	public int getCost(int id) {
		if (id != this.next_hop)
			return this.cost;

		return INFINITO;
	}

	public int getCost() {
		return cost;
	}
	
	/**
	 * Recupera o minimo de duas entradas (esta e outra).
	 * 
	 * @param other
	 *            outra entrada a ser comparada com esta.
	 * @return a entrada com custo menor.
	 */
	public Entry min(Entry other) {
		System.out.println("Este id " + this.id);
		System.out.println("Outro id " + this.id);
		
		System.out.println("Este custo = " + this.cost);
		System.out.println("Outro custo = " + other.cost);
		
		System.out.println("Este salto = " + this.next_hop);
		System.out.println("Outro salto = " + other.next_hop);
		
		if (this.cost <= other.cost) {
			System.out.println("Este Menor");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return this;
		}

		System.out.println("Outro menor");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return other;
	}

	/**
	 * Retorna igualdade se e somente se, obj tem o mesmo custo e o mesmo salto
	 * seguinte que este.
	 */
	public boolean equals(Object obj) {
		if (obj instanceof Entry) {
			Entry o = (Entry) obj;

			return this.cost == o.cost;
		}

		return false;
	}

	/**
	 * Recupera a entrada como String, na forma "no,distancia".
	 * 
	 * @param id
	 *            identificador para quem o roteador ira enviar esta entrada.
	 * @param active
	 *            flag que avisa caso a entrada esteja ativa
	 * @return a entrada na forma de String, "no,distancia".
	 */
	public String getAsString(int id) {
		return this.id + "," + getCost(id);
	}

	public int getId() {
		return id;
	}
}
